package com.intelligent.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.intelligent.pojo.Product;
import com.intelligent.service.ProductService;
import com.intelligent.utils.ExcelUtils;
import com.intelligent.utils.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 产品管理接口
 * 提供产品的新增、分页查询与CSV导出功能。
 */
@RestController
@RequestMapping("/product")
public class ProductController {

	@Resource
	private ProductService productService;

	/**
	 * 分页查询产品（关联单位和仓库名称）
	 * @param pageNo 页码
	 * @param pageSize 每页条数
	 * @param productCode 产品编码（模糊匹配，可选）
	 * @param productName 产品名称（模糊匹配，可选）
	 * @param sourceType 来源类型（模糊匹配，可选）
	 * @param status 状态 0启用 1停用（可选）
	 * @return 分页数据，包含单位名称与仓库名称
	 */
	@GetMapping("/page")
	public Result<IPage<Product>> page(@RequestParam(defaultValue = "1") long pageNo,
	                                   @RequestParam(defaultValue = "10") long pageSize,
	                                   @RequestParam(required = false) String productCode,
	                                   @RequestParam(required = false) String productName,
	                                   @RequestParam(required = false) String sourceType,
	                                   @RequestParam(required = false) Integer status) {
		Page<Product> page = new Page<>(pageNo, pageSize);
		IPage<Product> result = productService.pageProduct(page, productCode, productName, sourceType, status);
		return Result.success(result);
	}

	/**
	 * 新增产品，若未提供产品编码则自动生成。
	 */
	@PostMapping("/add")
	public Result<Boolean> create(@RequestBody Product product) {
		boolean ok = productService.createProduct(product);
		return ok ? Result.success(true) : Result.error("新增产品失败");
	}

	/**
	 * 修改产品
	 */
	@PutMapping("/update")
	public Result<Boolean> update(@RequestBody Product product) {
		boolean ok = productService.updateProduct(product);
		return ok ? Result.success(true) : Result.error("修改产品失败");
	}

	/**
	 * 根据ID查询产品详情（包含单位和仓库名称）
	 */
	@GetMapping("/{id}")
	public Result<Product> getById(@PathVariable("id") Long id) {
		Product product = productService.getByIdWithJoin(id);
		return product != null ? Result.success(product) : Result.error("未找到产品");
	}

	/**
	 * 根据ID删除产品
	 */
	@DeleteMapping("/{id}")
	public Result<Boolean> delete(@PathVariable("id") Long id) {
		boolean ok = productService.deleteProduct(id);
		return ok ? Result.success(true) : Result.error("删除产品失败");
	}
	/**
	 * 导出商品信息列表为Excel（关联单位和仓库名称）
	 *
	 * @param productCode 产品编码（模糊匹配，可选）
	 * @param productName 产品名称（模糊匹配，可选）
	 * @param sourceType 来源类型（模糊匹配，可选）
	 * @param status 状态 0启用 1停用（可选）
	 */
	@GetMapping("/export")
	public void export(HttpServletResponse response,
									   @RequestParam(required = false) String productCode,
									   @RequestParam(required = false) String productName,
									   @RequestParam(required = false) String sourceType,
									   @RequestParam(required = false) Integer status) throws  IOException{
		List<Product> list = productService.exportProductInfoToExcel(productCode, productName, sourceType, status);
		String[] headers = {"产品ID", "产品编码", "产品名称", "来源类型", "规格", "分类", "单位名称", "仓库名称", "当前库存", "采购价格", "销售价格", "成本价格", "状态"};
		ExcelUtils.exportToExcel(response, "product_info", "商品信息", headers, list, product -> new Object[]{
				product.getProductId(),
				product.getProductCode(),
				product.getProductName(),
				product.getSourceType(),
				product.getSpecification(),
				product.getCategory(),
				product.getUnitName(),
				product.getWarehouseName(),
				product.getCurrentStock(),
				product.getPurchasePrice(),
				product.getSalePrice(),
				product.getCostPrice(),
				product.getStatus()
		});
	}
}
